﻿<html DIR="LTR" xmlns:tool="http://www.microsoft.com/tooltip" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ddue="http://ddue.schemas.microsoft.com/authoring/2003/5" xmlns:MSHelp="http://msdn.microsoft.com/mshelp">
  <head>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8" />
    <META NAME="save" CONTENT="history" />
    <title>Usando buffer adaptável</title>
    
    <link rel="stylesheet" type="text/css" href="../local/Classic.css">
      
    </link>
    
    <script src="../local/script.js">
      
    </script><script src="../local/script_main.js">&amp;nbsp;</script>
  </head>
  <body>
    <!--Topic built:04/01/2010 05:03:30-->

    
    
    
    
    
    
    
    
    
    <div id="header">
      <table width="100%" id="topTable"><tr>
          <td align="left">
            <span id="headerBold">Usando buffer adaptável</span>
          </td>
          <td align="right">
            
          </td>
        </tr></table>
      
      
      
    </div>
    <div id="mainSection">
      
        
        
    <font color="DarkGray">
      
    </font>
    <p />
    
    <p />
  
        <div id="introductionSection" class="section">
    <p>O buffer adaptável é criado para recuperar qualquer tipo de dados de valor grande sem a sobrecarga de cursores de servidor. Aplicativos podem usar o recurso de utilização de buffer adaptável com todas as versões do SQL Server que têm suporte do driver.</p>
    <p>Normalmente, quando o Microsoft SQL Server JDBC Driver executar uma consulta, o driver recuperará todos os resultados do servidor em memória de aplicativo. Embora esta abordagem minimize o consumo de recursos no SQL Server, ela pode lançar um <b>OutOfMemoryError</b> no aplicativo de JDBC para as consultas que geram resultados muito grandes. </p>
    <p>Para permitir que aplicativos administrem resultados muito grandes, o Microsoft SQL Server JDBC Driver fornece buffer adaptável. Com buffer adaptável, o driver recupera os resultados da execução da instrução a partir do SQL Server à medida que o aplicativo precisa deles, em vez de todos de uma vez. O driver também descarta os resultados assim que o aplicativo já não os pode acessar. Veja a seguir alguns exemplos em que o buffer adaptável pode ser útil: </p>
    <ul><li>
        
          <b>A consulta gera um conjunto de resultados muito grande:</b> o aplicativo pode executar uma instrução SELECT que gera mais linhas que o aplicativo pode armazenar na memória. Em versões anteriores, o aplicativo tinha que usar um cursor de servidor para evitar um <b>OutOfMemoryError</b>. O buffer adaptável permite fazer uma passagem somente avanço somente leitura de um conjunto de resultados arbitrariamente grande sem exigir um cursor de servidor. <br />
      </li><li>
        
          <b>A consulta gera colunas muito grandes do </b>
          <a href="eaffcff1-286c-459f-83da-3150778480c9.htm">SQLServerResultSet</a>
          <b> ou </b>
          <a href="30710a63-c05d-47d9-9cf9-c087a1c76373.htm">SQLServerCallableStatement</a>
          <b> valores de parâmetro OUT:</b> o aplicativo pode recuperar um único valor (coluna ou parâmetro OUT) que seja muito grande para ajustar completamente na memória do aplicativo. O buffer adaptável permite que o aplicativo cliente recupere esse valor como um fluxo, usando os métodos <b>getAsciiStream</b>, <b>getBinaryStream,</b> ou <b>getCharacterStream</b>. O aplicativo recupera o valor do SQL Server à medida que lê o fluxo.<br />
        
        <br />
      </li></ul>
    <div style="margin: .5em 1.5em .5em 1.5em"><b>Observação: </b>
      Com buffer adaptável, o driver JDBC armazena em buffer somente a quantidade de dados necessária. O driver não fornece nenhum método público para controlar ou limitar o tamanho do buffer.<p />
    </div>
  </div><h1 class="heading">Definindo buffer adaptável</h1><div id="sectionSection0" class="section"><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5">
      <p xmlns="">A partir do driver JDBC versão 2.0, o comportamento padrão do driver é <b>adaptive</b>. Em outras palavras, para obter o comportamento de buffer adaptável, o aplicativo não precisa solicitar o comportamento adaptável explicitamente. Na versão 1.2, no entanto, o modo de buffer era "<b>full</b>" por padrão e o aplicativo precisava solicitar o modo de buffer adaptável explicitamente.</p>
      <p xmlns="">Há três maneiras de um aplicativo solicitar que a execução de instrução use buffer adaptável:</p>
      <ul xmlns=""><li>
          O aplicativo pode definir a propriedade de conexão <b>responseBuffering</b> como "adaptável". Para obter mais informações sobre como configurar as propriedades de conexão, consulte <a href="f1b62700-f046-488d-bd6b-a5cd8fc345b7.htm">Definindo as propriedades de conexão</a>. <br />
        </li><li>
          O aplicativo pode usar o método <a href="c9e43ff2-8117-4dca-982d-83c863d0c8e1.htm">setResponseBuffering</a> do objeto <a href="097434fd-2b74-411c-a5ed-eba04481dde5.htm">SQLServerDataSource</a> para definir o modo de buffer de resposta para todas as conexões criadas por aquele objeto <a href="097434fd-2b74-411c-a5ed-eba04481dde5.htm">SQLServerDataSource</a>.<br />
        </li><li>
          O aplicativo pode usar o método <a href="9f489835-6cda-4c8c-b139-079639a169cf.htm">setResponseBuffering</a> da classe <a href="ec24963c-8b51-4838-91e9-1fbfa2347451.htm">SQLServerStatement</a> para definir o modo de buffer de resposta para um objeto de instrução específico. <br />
        </li></ul>
      <p xmlns="">Ao usar o JDBC Driver versão 1.2, os aplicativos precisaram converter o objeto de instrução para uma classe <a href="ec24963c-8b51-4838-91e9-1fbfa2347451.htm">SQLServerStatement</a> para usar o método <a href="9f489835-6cda-4c8c-b139-079639a169cf.htm">setResponseBuffering</a>. Os exemplos de código no <a href="6c986144-3854-4352-8331-e79eccbefc28.htm">Lendo exemplo de dados grande</a> e no <a href="58c76635-a117-4661-8781-d6cb231c5809.htm">Exemplo de leitura de dados grandes com procedimentos armazenados</a> demonstram este uso antigo. </p>
      <p xmlns="">Porém, com o driver JDBC versão 2.0, os aplicativos podem usar o método <a href="53f3291f-d43a-476b-a656-d86168dacf6c.htm">isWrapperFor</a> e o método <a href="ce680176-ef04-4e44-bb6c-ec50bd06e7e6.htm">unwrap</a> para acessar a funcionalidade específica do fornecedor sem qualquer pressuposição sobre a hierarquia de classe de implementação. Para código de exemplo, consulte o tópico <a href="76ecc05f-a77d-40a2-bab9-91a7fcf17347.htm">Atualizando exemplo de dados grande</a>.</p>
    </content></div><h1 class="heading">Recuperando dados grandes com buffer adaptável</h1><div id="sectionSection1" class="section"><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5">
      <p xmlns="">Quando valores grandes são lidos uma vez usando os métodos get&lt;Type&gt;Stream e as colunas ResultSet e os parâmetros OUT do CallableStatement são acessados na ordem retornada pelo SQL Server, o buffer adaptável minimiza o uso de memória de aplicativo ao processar os resultados. Ao usar buffer adaptável:</p>
      <ul xmlns=""><li>
          Os métodos <b>get&lt;Type&gt;Stream</b> definidos nas classes <a href="eaffcff1-286c-459f-83da-3150778480c9.htm">SQLServerResultSet</a> e <a href="30710a63-c05d-47d9-9cf9-c087a1c76373.htm">SQLServerCallableStatement</a> retornam fluxos somente leitura por padrão, embora os fluxos possam ser reiniciados se estiver marcado pelo aplicativo. Se o aplicativo desejar <code>reset</code> o fluxo, primeiro terá que chamar o método <code>mark</code> naquele fluxo. <br />
        </li><li>
          Os métodos <b>get&lt;Type&gt;Stream</b> definidos nas classes <a href="24170524-e1ab-4e80-8fd1-6688efacfbde.htm">SQLServerClob</a> e <a href="88bd8623-889d-4b5d-99ff-c85b32f3ff5c.htm">SQLServerBlob</a> retornam fluxos que sempre podem ser reposicionados para a posição de início do fluxo sem chamar o método <code>mark</code>. <br />
        </li></ul>
      <p xmlns="">Quando o aplicativo usar buffer adaptável, os valores recuperados pelos métodos <b>get&lt;Type&gt;Stream</b> somente podem ser recuperados uma vez. Se você tentar chamar qualquer método <b>get&lt;Type&gt;</b> na mesma coluna ou parâmetro depois de chamar o método <b>get&lt;Type&gt;Stream</b> do mesmo objeto, uma exceção será lançada com a mensagem "Os dados foram acessados e não estão disponíveis para esta coluna ou parâmetro".</p>
    </content></div><h1 class="heading">Diretrizes para usar buffer adaptável</h1><div id="sectionSection2" class="section"><content xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5">
      <p xmlns="">Os desenvolvedores devem seguir estas diretrizes importantes para minimizar o uso de memória pelo aplicativo:</p>
      <ul xmlns=""><li>
          Evite usar a propriedade da cadeia de conexão <b>selectMethod=cursor</b> para permitir que o aplicativo processe um conjunto de resultados muito grande. O recurso de buffer adaptável permite que os aplicativos processem conjuntos de resultados somente encaminhamento e somente leitura muito grandes sem usar um cursor de servidor. Observe que, quando você define <b>selectMethod=cursor</b>, todos os conjuntos de resultados somente avanço e somente leitura gerados por aquela conexão são afetados. Em outras palavras, se seu aplicativo processar conjuntos de resultados curtos habitualmente com alguns linhas, criar, ler e fechar um cursor de servidor para cada conjunto de resultados usará mais recursos do lado do cliente e lado de servidor que seria o caso onde <b>selectMethod</b> não é definido como <b>cursor</b>.<br />
        </li><li>
          Leia texto grande ou valores binários como fluxos usando os métodos <b>getAsciiStream</b>, <b>getBinaryStream,</b> ou <b>getCharacterStream</b> em vez dos métodos <b>getBlob</b> ou <b>getClob</b>. A partir da versão 1.2, a classe <a href="30710a63-c05d-47d9-9cf9-c087a1c76373.htm">SQLServerCallableStatement</a> oferece novos métodos <b>get&lt;Type&gt;Stream</b> para este propósito.<br />
        </li><li>
          Verifique se as colunas com valores potencialmente grandes são colocadas por último na lista de colunas em uma instrução SELECT e se os métodos <b>get&lt;Type&gt;Stream</b> do <a href="eaffcff1-286c-459f-83da-3150778480c9.htm">SQLServerResultSet</a> são usados para acessar as colunas na ordem em que são selecionadas.<br />
        </li><li>
          Verifique se os parâmetros OUT com valores potencialmente grandes são declarados por último na lista de parâmetros no SQL usada para criar <a href="30710a63-c05d-47d9-9cf9-c087a1c76373.htm">SQLServerCallableStatement</a>. Além disso, verifique se os métodos <b>get&lt;Type&gt;Stream</b> do <a href="30710a63-c05d-47d9-9cf9-c087a1c76373.htm">SQLServerCallableStatement</a> são usados para acessar os parâmetros OUT na ordem em que eles são declarados.<br />
        </li><li>
          Evite executar mais de uma instrução na mesma conexão simultaneamente. Executar outra instrução antes de processar os resultados da instrução anterior pode fazer os resultados não processados serem armazenados em buffer na memória do aplicativo.<br />
        </li><li>
          Há alguns casos em que usar <b>selectMethod=cursor</b> em vez de <b>responseBuffering=adaptive</b> seria mais benéfico, por exemplo:<br />
          <ul><li>
              Se seu aplicativo processar um conjunto de resultados somente avanço e somente leitura lentamente, como ler cada linha depois de alguma entrada do usuário, usar <b>selectMethod=cursor</b> em vez de <b>responseBuffering=adaptive</b> pode ajudar a reduzir o uso de recurso pelo SQL Server. <br />
            </li><li>
              Se seu aplicativo processar dois ou mais conjuntos de resultados somente avanço e somente leitura ao mesmo tempo na mesma conexão, usar <b>selectMethod=cursor</b> em vez de <b>responseBuffering=adaptive</b> pode ajudar a reduzir a memória exigida pelo driver para processar estes conjuntos de resultados.<br />
            </li></ul>
          Em ambos os casos, você precisa considerar a sobrecarga de criar, ler e fechar os cursores de servidor.<br />
        </li></ul>
      <p xmlns="">Além disso, a lista a seguir fornece algumas recomendações para conjuntos de resultados roláveis e atualizáveis somente avanço:</p>
      <ul xmlns=""><li>
          Para conjuntos de resultados roláveis, ao buscar um bloco de linhas, o driver sempre lê na memória o número de linhas indicado pelo método <a href="7bc96930-b0c9-42f6-8df9-1d8d824408b3.htm">getFetchSize</a> do objeto <a href="eaffcff1-286c-459f-83da-3150778480c9.htm">SQLServerResultSet</a>, até mesmo quando o buffer adaptável está habilitado. Se rolar causar um <b>OutOfMemoryError</b>, você pode reduzir o número de linhas buscadas chamando o método <a href="233bf4f8-4758-42d0-a80b-33e34fa78027.htm">setFetchSize</a> do objeto <a href="eaffcff1-286c-459f-83da-3150778480c9.htm">SQLServerResultSet</a> para definir o tamanho da busca como um número menor de linhas, até mesmo 1 linha, se necessário. Se isto não impedir um <b>OutOfMemoryError, </b>evite incluir colunas muito grandes em conjuntos de resultados roláveis.<br />
        </li><li>
          Para conjuntos de resultados roláveis, ao buscar um bloco de linhas, o driver geralmente lê na memória o número de linhas indicado pelo método <a href="7bc96930-b0c9-42f6-8df9-1d8d824408b3.htm">getFetchSize</a> do objeto <a href="eaffcff1-286c-459f-83da-3150778480c9.htm">SQLServerResultSet</a>, até mesmo quando o buffer adaptável está habilitado na conexão. Se chamar o método <a href="60248447-6908-4036-a779-a501453cd553.htm">next</a> do objeto <a href="eaffcff1-286c-459f-83da-3150778480c9.htm">SQLServerResultSet</a> resultar em um <b>OutOfMemoryError</b>, você pode reduzir o número de linhas buscadas chamando o método <a href="233bf4f8-4758-42d0-a80b-33e34fa78027.htm">setFetchSize</a> do objeto <a href="eaffcff1-286c-459f-83da-3150778480c9.htm">SQLServerResultSet</a> para definir o tamanho da busca como um número menor de linhas, até mesmo 1 linha, se necessário. Você também pode forçar o driver a não armazenar em buffer nenhuma linha chamando o método <a href="9f489835-6cda-4c8c-b139-079639a169cf.htm">setResponseBuffering</a> do objeto <a href="ec24963c-8b51-4838-91e9-1fbfa2347451.htm">SQLServerStatement</a> com o parâmetro "<b>adaptive</b>" antes de executar a instrução. Como o conjunto de resultados não é rolável, se o aplicativo acessar um valor de coluna grande usando um dos métodos <b>get&lt;Type&gt;Stream</b>, o driver descartará o valor assim que for lido pelo aplicativo, da mesma maneira que faz para os conjuntos de resultados somente leitura somente avanço.<br />
        </li></ul>
    </content></div><span id="seeAlsoSpan"><h1 class="heading">Consulte também</h1></span><div id="seeAlsoSection" class="section" name="collapseableSection"><a href="e1592499-b87b-45ee-bab8-beaba8fde841.htm">Melhorando o desempenho e a confiabilidade com o JDBC Driver</a><br /><br /></div><!--[if gte IE 5]>
			<tool:tip element="seeAlsoToolTip" avoidmouse="false"/><tool:tip element="languageFilterToolTip" avoidmouse="false"/><tool:tip element="roleInfoSpan" avoidmouse="false"/>
		<![endif]-->
      <div id="footer" class="section">
        
		<hr />
		
		<span id="fb" class="feedbackcss">
			
			
		</span>
		
		<a href="9bad553b-9e70-4696-8499-2e35f772a1e0.htm">
			
			© 2010 Microsoft Corporation. Todos os direitos reservados.
		</a>
 	
	
      </div>
    </div>
  </body>
</html>